﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace DIProject.Util
{
    /// <summary>
    /// расчет цены по правилам
    /// </summary>
    public class PriceCalculation
    {
       

        private  XmlDocument doc;
        private  decimal maxSum;
        private  double maxMargin;
        private  decimal minSum;
        private  double minMargin;
        private  bool IsFileLoad = false;
        private  List<RulesItemInfo> rules = new List<RulesItemInfo>();
        public PriceCalculation(Int32 deptId)
        {
            string fileName = System.IO.Directory.GetCurrentDirectory() +  "/RulesCalculation.xml";
            doc = new XmlDocument();
            string strDeptId = deptId.ToString();            
            try
            {
                doc.Load(fileName);
                XmlNode depart = doc.SelectSingleNode("/rules/depart[@id='" + strDeptId + "']");
                XmlNode maxPrice = depart.SelectSingleNode("maxPrice");
                if(maxPrice == null)
                    return;
                maxSum = System.Convert.ToDecimal(maxPrice.Attributes["price"].Value, System.Globalization.CultureInfo.InvariantCulture);
                maxMargin = System.Convert.ToDouble(maxPrice.Attributes["margin"].Value, System.Globalization.CultureInfo.InvariantCulture);
                XmlNode minPrice = depart.SelectSingleNode("minPrice");
                if (minPrice == null)
                    return;
                minSum = System.Convert.ToDecimal(minPrice.Attributes["price"].Value, System.Globalization.CultureInfo.InvariantCulture);
                minMargin = System.Convert.ToDouble(minPrice.Attributes["margin"].Value, System.Globalization.CultureInfo.InvariantCulture);
                IsFileLoad = true;
                XmlNode inner = depart.SelectSingleNode("inner");
                if (inner == null)
                    return;
                foreach (XmlNode item in inner.ChildNodes)
                {
                    RulesItemInfo ri = new RulesItemInfo();
                    ri.Begin = System.Convert.ToDecimal(item.Attributes["begin"].Value, System.Globalization.CultureInfo.InvariantCulture);
                    ri.End = System.Convert.ToDecimal(item.Attributes["end"].Value, System.Globalization.CultureInfo.InvariantCulture);
                    ri.Margin = System.Convert.ToDouble(item.Attributes["margin"].Value, System.Globalization.CultureInfo.InvariantCulture);
                    rules.Add(ri);
                }
            }
            catch (Exception ee)
            {
                throw new DIException("Не верная структура файла правил расчета цен или он отсутсвует",ee);
            }
        }
        public  double Calculate(decimal supplierPrice)
        {
            if (!IsFileLoad)
            {
                System.Windows.Forms.MessageBox.Show("Не верная структура файла правил расчета цен или он отсутсвует");
                throw new DIException("Не верная структура файла правил расчета цен или он отсутсвует");
            }
            if (supplierPrice < minSum)
            {
                return minMargin;
            }
            if (supplierPrice >= maxSum)
            {
                return maxMargin;
            }
            foreach (RulesItemInfo rii in rules)
            {
                if ((supplierPrice >= rii.Begin) && (supplierPrice <= rii.End))
                {
                    return rii.Margin;                    
                }
            }
            return 0;
        }
    }
    public class RulesItemInfo
    {
        private decimal _begin;
        /// <summary>
        /// начало диапазона
        /// </summary>
        public decimal Begin
        {
            get { return _begin; }
            set { _begin = value; }
        }
        private decimal _end;
        /// <summary>
        /// конец диапазона
        /// </summary>
        public decimal End
        {
            get { return _end; }
            set { _end = value; }
        }
        private double _margin;
        /// <summary>
        /// наценка
        /// </summary>
        public double Margin
        {
            get { return _margin; }
            set { _margin = value; }
        }

    }
}
